home *** CD-ROM | disk | FTP | other *** search
/ Nibble Magazine / nib04.dsk / MAD MAD MAD MAD CUBE.bas < prev    next >
BASIC Source File  |  2023-02-26  |  13KB  |  338 lines

  1. 1  REM  ******************************
  2. 2  REM  ** THE MAD MAD MAD MAD CUBE **
  3. 3  REM  **     BY RICH HATCHER      **
  4. 4  REM  **   COPYRIGHT (C) 1980 BY  **
  5. 5  REM  **     MICRO-SPARC, INC.    **
  6. 6  REM  **     LINCOLN, MA 01773    **
  7. 7  REM  ******************************
  8. 10  GOTO 2340
  9. 20  REM  *********************
  10. 30  REM  DRAW SQUARE AT X,Y
  11. 40  FOR W = X TO X +1: VLIN Y,Y +2 AT W: NEXT W
  12. 50  RETURN 
  13. 60  REM  *********************
  14. 70  REM  DRAW BOXES ON SCREEN
  15. 80  FOR FA = 0 TO 11: REM  FACE
  16. 90  FOR RO = 0 TO 2: REM  ROW
  17. 100  FOR CO = 0 TO 2: REM  COLUMN
  18. 110 X = (FA - INT(FA/3) *3) *9 +CO *3 +6
  19. 120 Y =  INT(FA/3) *12 +RO *4
  20. 130  COLOR= NC(FA,RO,CO)
  21. 140  GOSUB 30
  22. 150  NEXT CO: NEXT RO: NEXT FA
  23. 160  RETURN 
  24. 170  REM  **********************
  25. 180  REM  DO EQUIVALENT ROTATES
  26. 190  REM  ROT CTR CLOCKWISE
  27. 200  FOR RO = 0 TO 2: FOR CO = 0 TO 2:HC(RO,CO) = NC(OF,RO,CO): NEXT CO: NEXT RO
  28. 210  FOR NR = 0 TO 2: FOR MC = 0 TO 2
  29. 220 DR = MC:OC = 2 -NR
  30. 230 NC(NF,NR,MC) = HC(DR,OC)
  31. 240  NEXT MC: NEXT NR
  32. 250  RETURN 
  33. 260  REM  ROT CLOCKWISE
  34. 270  FOR RO = 0 TO 2: FOR CO = 0 TO 2:HC(RO,CO) = NC(OF,RO,CO): NEXT CO: NEXT RO
  35. 280  FOR NR = 0 TO 2: FOR MC = 0 TO 2
  36. 290 DR = 2 -MC:OC = NR
  37. 300 NC(NF,NR,MC) = HC(DR,OC)
  38. 310  NEXT MC: NEXT NR
  39. 320  RETURN 
  40. 330  REM  FACES 0,2,6,8,9,& 11 ARE ROTATED COPIES OF 3 & 5
  41. 340 NF = 6:OF = 3: GOSUB 200
  42. 350 NF = 8:OF = 5: GOSUB 270
  43. 360 NF = 9:OF = 6: GOSUB 200
  44. 370 NF = 11:OF = 8: GOSUB 270
  45. 380 NF = 0:OF = 9: GOSUB 200
  46. 390 NF = 2:OF = 11: GOSUB 270
  47. 400  RETURN 
  48. 410  REM  ****************
  49. 420  REM  ROTATE AXIS
  50. 430  IF  PDL(1) >200  THEN 620
  51. 440  IF  PDL(1) <50  THEN 690
  52. 450  IF  PDL(0) >200  THEN 550
  53. 460  IF  PDL(0) <50  THEN 480
  54. 470  GOTO 430
  55. 480  REM  ROTATE AXIS LEFT
  56. 490 RO = 0: GOSUB 1770
  57. 500 NF = 1:OF = 1: GOSUB 270
  58. 510 RO = 1: GOSUB 1770
  59. 520 RO = 2: GOSUB 1770
  60. 530 NF = 7:OF = 7: GOSUB 200
  61. 540  GOTO 1950
  62. 550  REM  ROTATE AXIS RIGHT
  63. 560 RO = 0: GOSUB 1700
  64. 570 NF = 1:OF = 1: GOSUB 200
  65. 580 RO = 1: GOSUB 1700
  66. 590 RO = 2: GOSUB 1700
  67. 600 NF = 7:OF = 7: GOSUB 270
  68. 610  GOTO 1950
  69. 620  REM  ROTATE AXIS DOWN
  70. 630 CO = 0: GOSUB 1600
  71. 640 NF = 3:OF = 0: GOSUB 1890
  72. 650 CO = 1: GOSUB 1600
  73. 660 CO = 2: GOSUB 1600
  74. 670 NF = 5:OF = 2: GOSUB 1890
  75. 680  GOTO 1950
  76. 690  REM  ROTATE AXIS UP
  77. 700 CO = 0: GOSUB 1530
  78. 710 NF = 3:OF = 6: GOSUB 1890
  79. 720 CO = 1: GOSUB 1530
  80. 730 CO = 2: GOSUB 1530
  81. 740 NF = 5:OF = 8: GOSUB 1890
  82. 750  GOTO 1950
  83. 760  REM  *********************
  84. 770  REM  INPUT MOVES
  85. 780  CALL  -198: REM  BELL
  86. 790  GOSUB 1970: REM  BLINK
  87. 800 X =  PEEK( -16287): IF X >128  THEN 840: REM  PLAY
  88. 810 Y =  PEEK( -16384): IF Y >128  THEN 2220: REM  END
  89. 820 X =  PEEK( -16286): IF Z >128  THEN 420: REM  FULL ROTATE
  90. 830  GOTO 790
  91. 840  IF PO$ = "L"  THEN 900
  92. 850  IF PO$ = "R"  THEN 1010
  93. 860  IF PO$ = "T"  THEN 1120
  94. 870  IF PO$ = "B"  THEN 1230
  95. 880  IF PO$ = "C"  THEN 1340
  96. 890  REM  ********************
  97. 900  REM  LEFT COLUMN MOVE
  98. 910  IF  PDL(1) >200  THEN 950
  99. 920  IF  PDL(1) <50  THEN 980
  100. 930  GOTO 910
  101. 940  REM  MOVE DOWN
  102. 950 CO = 0: GOSUB 1600
  103. 960 NF = 3:OF = 0: GOSUB 1890: GOTO 1950
  104. 970  REM  MOVE UP
  105. 980 CO = 0: GOSUB 1530
  106. 990 NF = 3:OF = 6: GOSUB 1890: GOTO 1950
  107. 1000  REM  ********************
  108. 1010  REM  RIGHT COLUMN MOVE
  109. 1020  IF  PDL(1) >200  THEN 1060
  110. 1030  IF  PDL(1) <50  THEN 1090
  111. 1040  GOTO 1020
  112. 1050  REM  MOVE DOWN
  113. 1060 CO = 2: GOSUB 1600
  114. 1070 NF = 5:OF = 2: GOSUB 1890: GOTO 1950
  115. 1080  REM  MOVE UP
  116. 1090 CO = 2: GOSUB 1530
  117. 1100 NF = 5:OF = 8: GOSUB 1890: GOTO 1950
  118. 1110  REM  ********************
  119. 1120  REM  TOP ROW MOVE
  120. 1130  IF  PDL(0) >200  THEN 1170
  121. 1140  IF  PDL(0) <50  THEN 1200
  122. 1150  GOTO 1130
  123. 1160  REM  MOVE RIGHT
  124. 1170 RO = 0: GOSUB 1700
  125. 1180 NF = 1:OF = 1: GOSUB 200: GOTO 1950
  126. 1190  REM  MOVE LEFT
  127. 1200 RO = 0: GOSUB 1700
  128. 1210 NF = 1:OF = 1: GOSUB 270: GOTO 1950
  129. 1220  REM  ********************
  130. 1230  REM  BOTTOM ROW MOVE
  131. 1240  IF  PDL(0) >200  THEN 1280
  132. 1250  IF  PDL(0) <50  THEN 1310
  133. 1260  GOTO 1240
  134. 1270  REM  MOVE RIGHT
  135. 1280 RO = 2: GOSUB 1700
  136. 1290 NF = 7:OF = 7: GOSUB 270: GOTO 1950
  137. 1300  REM  MOVE LEFT
  138. 1310 RO = 2: GOSUB 1770
  139. 1320 NF = 7:OF = 7: GOSUB 200: GOTO 1950
  140. 1330  REM  ********************
  141. 1340  REM  CENTER ROW OR COL MOVE
  142. 1350  IF  PDL(0) >200  THEN 1410
  143. 1360  IF  PDL(0) <50  THEN 1440
  144. 1370  IF  PDL(1) >200  THEN 1470
  145. 1380  IF  PDL(1) <50  THEN 1500
  146. 1390  GOTO 1350
  147. 1400  REM  MOVE RIGHT
  148. 1410 RO = 1: GOSUB 1700
  149. 1420  GOTO 1950
  150. 1430  REM  MOVE LEFT
  151. 1440 RO = 1: GOSUB 1770
  152. 1450  GOTO 1950
  153. 1460  REM  MOVE DOWN
  154. 1470 CO = 1: GOSUB 1600
  155. 1480  GOTO 1950
  156. 1490  REM  MOVE UP
  157. 1500 CO = 1: GOSUB 1530
  158. 1510  GOTO 1950
  159. 1520  REM  ******************
  160. 1530  REM  MOVE CO UP
  161. 1540 FA = 1: GOSUB 1670: REM  SAVE
  162. 1550 NF = 1:OF = 4: GOSUB 1690
  163. 1560 NF = 4:OF = 7: GOSUB 1690
  164. 1570 NF = 7:OF = 10: GOSUB 1690
  165. 1580 FA = 10: GOSUB 1680
  166. 1590  RETURN 
  167. 1600  REM  MOVE CO DOWN
  168. 1610 FA = 10: GOSUB 1670: REM  SAVE
  169. 1620 NF = 10:OF = 7: GOSUB 1690
  170. 1630 NF = 7:OF = 4: GOSUB 1690
  171. 1640 NF = 4:OF = 1: GOSUB 1690
  172. 1650 FA = 1: GOSUB 1680
  173. 1660  RETURN 
  174. 1670  FOR RO = 0 TO 2:HC(RO,CO) = NC(FA,RO,CO): NEXT RO: RETURN 
  175. 1680  FOR RO = 0 TO 2:NC(FA,RO,CO) = HC(RO,CO): NEXT RO: RETURN 
  176. 1690  FOR RO = 0 TO 2:NC(NF,RO,CO) = NC(OF,RO,CO): NEXT RO: RETURN 
  177. 1700  REM  MOVE RO RIGHT
  178. 1710 FA = 4: GOSUB 1840: REM  SAVE
  179. 1720 NF = 4:OF = 3: GOSUB 1860
  180. 1730 NF = 3:OF = 10: GOSUB 1870
  181. 1740 NF = 10:OF = 5: GOSUB 1880
  182. 1750 FA = 5: GOSUB 1850
  183. 1760  RETURN 
  184. 1770  REM  MOVE RO LEFT
  185. 1780 FA = 4: GOSUB 1840: REM  SAVE
  186. 1790 NF = 4:OF = 5: GOSUB 1860
  187. 1800 NF = 5:OF = 10: GOSUB 1870
  188. 1810 NF = 10:OF = 3: GOSUB 1880
  189. 1820 FA = 3: GOSUB 1850
  190. 1830  RETURN 
  191. 1840  FOR CO = 0 TO 2:HC(RO,CO) = NC(FA,RO,CO): NEXT CO: RETURN 
  192. 1850  FOR CO = 0 TO 2:NC(FA,RO,CO) = HC(RO,CO): NEXT CO: RETURN 
  193. 1860  FOR CO = 0 TO 2:NC(NF,RO,CO) = NC(OF,RO,CO): NEXT CO: RETURN 
  194. 1870  FOR CO = 0 TO 2:NC(NF,RO,CO) = NC(OF,2 -RO,2 -CO): NEXT CO: RETURN 
  195. 1880  FOR CO = 0 TO 2:NC(NF,2 -RO,CO) = NC(OF,RO,2 -CO): NEXT CO: RETURN 
  196. 1890  REM  COPY FACE OF TO NF
  197. 1900  FOR RO = 0 TO 2
  198. 1910  FOR CO = 0 TO 2
  199. 1920 NC(NF,RO,CO) = NC(OF,RO,CO)
  200. 1930  NEXT CO: NEXT RO
  201. 1940  RETURN 
  202. 1950  GOSUB 340: GOSUB 70
  203. 1960  GOTO 770
  204. 1970  REM  BLINK JOYSTK POSITION
  205. 1980 PO$ = "C": REM  DEFAULT
  206. 1990  REM  READ JOYSTICK
  207. 2000  IF  PDL(0) <50  AND  PDL(1) >50  THEN PO$ = "L"
  208. 2010  IF  PDL(0) >200  AND  PDL(1) >50  THEN PO$ = "R"
  209. 2020  IF  PDL(1) <50  AND  PDL(0) >50  THEN PO$ = "T"
  210. 2030  IF  PDL(1) >200  AND  PDL(0) >50  THEN PO$ = "B"
  211. 2040 RO = 1:CO = 1
  212. 2050  IF PO$ = "L"  THEN CO = 0
  213. 2060  IF PO$ = "R"  THEN CO = 2
  214. 2070  IF PO$ = "T"  THEN RO = 0
  215. 2080  IF PO$ = "B"  THEN RO = 2
  216. 2090 HC(RO,CO) = NC(4,RO,CO):NC(4,RO,CO) = BK
  217. 2100  GOSUB 2140
  218. 2110 NC(4,RO,CO) = HC(RO,CO)
  219. 2120  GOSUB 2140
  220. 2130  RETURN 
  221. 2140  REM  DRAW SQUARE AT FA,RO,CO
  222. 2150 FA = 4
  223. 2160 X = (FA - INT(FA/3) *3) *9 +CO *3 +6
  224. 2170 Y =  INT(FA/3) *12 +RO *4
  225. 2180  COLOR= NC(FA,RO,CO)
  226. 2190  GOSUB 30
  227. 2200  RETURN 
  228. 2210  REM  *********************
  229. 2220  REM  TERMINATION PROCEDURE
  230. 2230  POKE  -16368,0: REM  KBD STROBE
  231. 2240  TEXT : HOME : PRINT " DO YOU WANT TO SAVE THIS GAME ?": GET Z$: PRINT Z$: IF Z$ = "Y"  THEN 2270
  232. 2250  PRINT : PRINT : PRINT : PRINT " DO YOU WANT TO CONTINUE PLAYING ?": GET Z$: PRINT Z$: IF Z$ = "N"  THEN  END 
  233. 2260 X$ = "Y": GOTO 2680
  234. 2270 D$ =  CHR$(4): PRINT D$"OPEN COLOR CUBE OLD GAME"
  235. 2280  PRINT D$"WRITE COLOR CUBE OLD GAME"
  236. 2290 FA = 3: GOSUB 2320:FA = 1: GOSUB 2320:FA = 5: GOSUB 2320:FA = 4: GOSUB 2320:F<CTRL-A>A = 7: GOSUB 2320:FA = 10: GOSUB 2320
  237. 2300  PRINT D$"CLOSE COLOR CUBE OLD GAME"
  238. 2310  GOTO 2250
  239. 2320  FOR RO = 0 TO 2: FOR CO = 0 TO 2: PRINT NC(FA,RO,CO): NEXT CO: NEXT RO: RETURN 
  240. 2330  REM  *********************
  241. 2340  REM  INITIALIZATION
  242. 2350  REM 
  243. 2360  REM  COLOR ASSIGNMENT
  244. 2370 BK = 0:RD = 1:BL = 2:GN = 4:BR = 8:NG = 9:YE = 13:WH = 15
  245. 2380  DIM NC(11,2,2),HC(2,2)
  246. 2390  HOME : VTAB 10: HTAB 5: INVERSE : PRINT "*** THE MAD MAD MAD MAD CUBE ***": NORMAL : HTAB 15: PRINT "BY RICH HATCHER": PRINT : HTAB 10: PRINT "COPYRIGHT (C) 1981 BY": HTAB 10: PRINT " MICRO-SPARC, INC.": HTAB 10: PRINT " LINCOLN, MA 01773"
  247. 2400  PRINT : PRINT "DO YOU WANT INSTRUCTIONS ?": GET Y$: PRINT Y$: IF Y$ = "Y"  THEN  GOSUB 2900
  248. 2410  HOME : PRINT "DO YOU WANT TO SET UP ?": GET X$: PRINT X$: IF X$ = "N"  THEN 2660
  249. 2420  HOME : PRINT "  RED      =R": PRINT "  BLUE     =B": PRINT "  GREEN    =G": PRINT "  ORANGE   =O": PRINT "  YELLOW   =Y": PRINT "  WHITE    =W": PRINT : PRINT : POKE 34,7
  250. 2430 F$ = "FRONT FACE":FA = 4: GOSUB 2500
  251. 2440 F$ = "LEFT FACE":FA = 3: GOSUB 2500
  252. 2450 F$ = "RIGHT FACE":FA = 5: GOSUB 2500
  253. 2460 F$ = "TOP FACE":FA = 1: GOSUB 2500
  254. 2470 F$ = "BOTTOM FACE":FA = 7: GOSUB 2500
  255. 2480 F$ = "REAR FACE":FA = 10: GOSUB 2500
  256. 2490  TEXT : GOTO 2680
  257. 2500  FOR RO = 0 TO 2: FOR CO = 0 TO 2: PRINT F$", ROW "RO", COLUMN "CO", ";: GOSUB 2510:NC(FA,RO,CO) = C: NEXT CO: NEXT RO: RETURN 
  258. 2510  GET C$: IF C$ = "R"  THEN C = RD
  259. 2520  IF C$ = "B"  THEN C = BL
  260. 2530  IF C$ = "G"  THEN C = GN
  261. 2540  IF C$ = "O"  THEN C = NG
  262. 2550  IF C$ = "Y"  THEN C = YE
  263. 2560  IF C$ = "W"  THEN C = WH
  264. 2570  IF C$ = "R"  OR C$ = "B"  OR C$ = "G"  OR C$ = "O"  OR C$ = "Y"  OR C$ = "W"  THEN 2590
  265. 2580  PRINT  CHR$(7);: GOTO 2510
  266. 2590  IF C$ = "R"  THEN  PRINT "RED"
  267. 2600  IF C$ = "B"  THEN  PRINT "BLUE"
  268. 2610  IF C$ = "G"  THEN  PRINT "GREEN"
  269. 2620  IF C$ = "O"  THEN  PRINT "ORANGE"
  270. 2630  IF C$ = "Y"  THEN  PRINT "YELLOW"
  271. 2640  IF C$ = "W"  THEN  PRINT "WHITE"
  272. 2650  RETURN 
  273. 2660  HOME : PRINT "DO YOU WANT TO CONTINUE PREVIOUS SET UP?": GET X$: PRINT X$: IF X$ = "Y"  THEN 2740
  274. 2670  REM  INITIALIZE GRAPHICS
  275. 2680  GR : POKE  -16302,0: COLOR= BK: FOR Y = 40 TO 47: HLIN 0,39 AT Y: NEXT Y
  276. 2690  COLOR= BR
  277. 2700  FOR R = 0 TO 2: HLIN 6,31 AT R *12 +11: NEXT R
  278. 2710  FOR C = 0 TO 1: VLIN 0,46 AT C *9 +14: NEXT C
  279. 2720  IF X$ = "Y"  THEN 2880
  280. 2730  GOTO 2820
  281. 2740  REM  READ FROM DISK
  282. 2750 D$ =  CHR$(4): PRINT D$"OPEN COLOR CUBE OLD GAME"
  283. 2760  PRINT D$"READ COLOR CUBE OLD GAME"
  284. 2770 F = 3: GOSUB 2800:F = 1: GOSUB 2800:F = 5: GOSUB 2800:F = 4: GOSUB 2800:F = 7: GOSUB 2800:F = 10: GOSUB 2800
  285. 2780 : PRINT D$"CLOSE COLOR CUBE OLD GAME"
  286. 2790  GOTO 2680
  287. 2800  FOR RO = 0 TO 2: FOR CO = 0 TO 2: INPUT NC(F,RO,CO): NEXT CO: NEXT RO: RETURN 
  288. 2810  REM  ********************   DEFAULT INITIALIZATION
  289. 2820 FA = 3:CL = RD: GOSUB 2890
  290. 2830 FA = 1:CL = BL: GOSUB 2890
  291. 2840 FA = 5:CL = YE: GOSUB 2890
  292. 2850 FA = 4:CL = GN: GOSUB 2890
  293. 2860 FA = 7:CL = NG: GOSUB 2890
  294. 2870 FA = 10:CL = WH: GOSUB 2890
  295. 2880  GOSUB 340: GOSUB 70: GOTO 770: REM  BEGIN PLAY
  296. 2890  FOR RO = 0 TO 2: FOR CO = 0 TO 2:NC(FA,RO,CO) = CL: NEXT CO: NEXT RO: RETURN 
  297. 2900 : HOME : PRINT "THIS IS A FLAT VERSION OF A THREE       DIMENSIONAL COLORED CUBE."
  298. 2910  PRINT 
  299. 2920  PRINT "EACH SIDE IS NINE SQUARES AND STARTS    WITH ALL SQUARES OF ONE COLOR"
  300. 2930  PRINT 
  301. 2940  PRINT "EACH SIDE MAY BE ROTATED WHICH MIXES    THE COLORS VERY QUICKLY."
  302. 2950  PRINT 
  303. 2960  PRINT "THE SCREEN SHOWS THE FRONT FACE WITH THE LEFT, RIGHT, TOP, AND BOTTOM FACES     SURROUNDING IT AS IF THEY WERE UNFOLDED"
  304. 2970  PRINT 
  305. 2980  PRINT "THE REAR FACE IS SHOWN UNFOLDED FROM THE BOTTOM."
  306. 2990  PRINT 
  307. 3000  PRINT "THE LEFT AND RIGHT FACES ARE SHOWN      ROTATED ON EITHER SIDE OF THE TOP,      BOTTOM AND REAR FACES."
  308. 3010  VTAB 23: PRINT "HIT SPACE BAR FOR MORE": GET Y$: PRINT Y$: HOME 
  309. 3020  PRINT "TO ROTATE A SECTION, THE PADDLE INPUTS  ARE USED IN TWO STEPS (A JOYSTICK IS    ASSUMED)."
  310. 3030  PRINT 
  311. 3040  PRINT "POSITION THE JOYSTICK IN THE ROW OR     COLUMN OF THE FRONT FACE (BLINKING)     THAT YOU WISH TO ROTATE."
  312. 3050  PRINT "VISUALIZE THE FRONT FACE (BLINKING)"
  313. 3060  PRINT "WITH THE JOYSTICK IN FIVE POSITIONS"
  314. 3070  PRINT "LEFT; RIGHT; TOP; BOTTOM; AND CENTER"
  315. 3080  PRINT 
  316. 3090  PRINT "             T"
  317. 3100  PRINT "             ."
  318. 3110  PRINT "             ."
  319. 3120  PRINT "         L...C...R"
  320. 3130  PRINT "             ."
  321. 3140  PRINT "             ."
  322. 3150  PRINT "             B"
  323. 3160  PRINT : PRINT : PRINT " NOW PUSH BUTTON (0)"
  324. 3170  VTAB 23: PRINT "HIT SPACE BAR FOR MORE": GET Y$: PRINT Y$: HOME 
  325. 3180  PRINT "AFTER CHOOSING ONE OF THE FIVE THEN"
  326. 3190  PRINT "THEN MOVE THE JOYSTICK UP OR DOWN       OR LEFT OR RIGHT IN THE DIRECTION OF    MOVEMENT"
  327. 3200  PRINT : PRINT "TO ROTATE THE ENTIRE CUBE USE BUTTON(1)"
  328. 3210  PRINT "WITH THE JOYSTICK IN THE CENTER."
  329. 3220  PRINT : PRINT "THEN MOVE THE JOYSTICK IN THE DIRECTION"
  330. 3230  PRINT "YOU WISH TO ROTATE."
  331. 3240  PRINT : PRINT "AFTER EACH CHANGE, THE SPEAKER BEEPS"
  332. 3250  PRINT "TO SIGNAL IT IS READY FOR THE NEXT INPUT"
  333. 3260  PRINT 
  334. 3270  PRINT "A SETUP MAY BE INPUT MANUALLY AND A     CURRENT POSITION MAY BE SAVED TO DISK   AND READ FROM DISK."
  335. 3280  PRINT 
  336. 3290  PRINT "  HIT ANY KEY TO STOP THE GAME"
  337. 3300  VTAB 23: PRINT "  HIT SPACE TO BEGIN": GET Y$: PRINT Y$
  338. 3310  RETURN